/**
 * formateUrl : 序列化 GET请求的 URL;
 *   
 * formateUrl( url路径 | string , data 数据 | object );
 * 
 * @return url | string ;
 * */ 

function formateUrl( url , data ){
    var start = true;
    for(var key in data){
          url += (start ? "?" : "&") + key + "=" + data[key] ;
          start = false;
    }
    return url;
}
/**
* formateUrl : 序列化 GET请求的 URL;
*   
* formateUrl( [ url | string ] , data | object );
*   
* @return 
* 
* 1. key=value;
* 2. url?key=value;
* 
* */ 

function formate( url , data ){
    var type = "GET";
    if( typeof url === "object" && !(url instanceof Array) ){
          data = url;
          type = "POST";
          url = "";
    }
    var start = true;
    for(var key in data){
          if( type === "GET"){
               url += (start ? "?" : "&") + key + "=" + data[key] ;
          }else{
                url += (start ? "" : "&") + key + "=" + data[key] ;
          }
          start = false;
    }
    return url;
}
/**
* ajax : 发送ajax请求
*   
* ajax( method | string  , url | string  , callback | function , data | object );
*   
* @return xhr 
* 
* */ 
function ajax( options ){
    // 参数优化为了啥?
    // 增加默认参数;
    // 对象合并;
    options = Object.assign( {
          method : "GET" ,
          callback : function(){},
          url : "",
          data : {},
          // jsonp形式的回调函数名
          jsonpcallback : "callback"
    } , options );

    if(options.method === "jsonp"){
          // 请求发送;
          var script = document.createElement("script");
          script.src = formate( options.url , options.data );
          document.body.appendChild( script );
          window[options.jsonpcallback] = function( data ){
                options.callback(data);
          }
          script.onload = function(){
                script.remove();
          }
    }else{
          var xhr = new XMLHttpRequest();
          xhr.open( options.method , options.method.toUpperCase() === "GET" ? formate( options.url , options.data ) : options.url );
          if( options.method.toUpperCase() === "POST"){
                xhr.setRequestHeader("content-type", "application/x-www-form-urlencoded");
          }
          xhr.send( options.method.toUpperCase() === "POST" ? formate( options.data ) : null );
          xhr.onreadystatechange = function(){
                if( xhr.readyState === 4 && /^2\d{2}/.test(xhr.status)){
                      options.callback( xhr.responseText )
                }
          }
    }
}